import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)

/**
 *clase mundo 
 * @author Anthony Robledo 
 * @version 1.1
 */
public class mundo extends World
{
    //private int cont=0;
    private int vidas;//vidas que tiene el jugador
    private Cont bal;// contador de balas
    private Cont distancia;// contador de la distancia que hay que recorrer
    private int metros;// metros que se van a recorrer
    protected int municiones;// municiones disponibles
    private Vidas vida;// objeto de clase Vidas para dibujar los corazones
    private int est;//estado del menu
    protected int nMalosos;//numero de malos que saldran en el juego
    protected int nivel;//nivel del juego
    
    /**
     * Constructor for objects of class mundo.
     * 
     */
    public mundo()
    {    
        // Create a new world with 600x400 cells with a cell size of 1x1 pixels.
        super(610, 389, 1);
        preparaMenu();
        super.setPaintOrder(Maloso.class,jugador.class,Obstaculo.class);
        nivel=1;
        vidas=3;
        metros=3000;
        prepare();
    }
    /**
     * actualiza el valor del contador
     */
    public void actualizaCont()
    {
        municiones=municiones-1;
        bal.actualiza(municiones);
    }
    /**
     * determina si gano o solo subio de nivel
     */
    public void gana()
    {
        if(metros<10&&nivel<=2)
        {
           addObject(new Next(),this.getWidth()/2,this.getHeight()/2);
           municiones=municiones+20;
           Greenfoot.delay(200);
           super.removeObjects(getObjects(null));
           metros=3000;
           bal= new Cont(municiones);
           addObject(bal,10,10);
           distancia= new Cont(metros);
           addObject(distancia,593,10);
           vida= new Vidas();
           vida.cambiaVidas(vidas);
           addObject(vida,460,15);
           cambiaEscenario(3);
           jugador g=new jugador();
           addObject(g,60,250);
           nivel=nivel+1;
        }
        if(nivel==3&&metros<5){
           super.removeObjects(getObjects(null));
           super.setBackground("winner.png");
           Greenfoot.delay(300); 
           preparaMenu();
           prepare();
           nivel=1;
           metros=3000;
           est=0;
        }
    }
    /**
     * avanza la distancia recorrida
     */
    public void avanza()
    {
        metros=metros-3;
        distancia.actualiza(metros); 
    }
    /**
     * retrocede la distancia recorrida
     */
    public  void retrocede()
    {
        metros=metros+3;
        distancia.actualiza(metros);
    }
    /**
     * prepara la imagen de fondo del menu
     */
    public void preparaMenu()
    {
        super.setBackground("menu.png");
        
    }   
    /**
     * actua del menu
     */
    public void act()
    {
       esFin();
       if(est==1)
          PreparaMalosos();  
       if(vidas==0)
          est=0;
       if(metros<6)
          gana();
        //PreparaObst();
       //Greenfoot.delay(10);
        
    }
    /**
     * cambia el fondo del escenario
     * @param t indica que imagen deve poner
     */
    public void cambiaEscenario(int t)
    { 
        int x;
        super.removeObjects(super.getObjects(Obstaculo.class));
        super.removeObjects(super.getObjects(Obstaculo2.class));
        super.removeObjects(super.getObjects(Maloso.class));
        for(x=50;x<650;x+=102)
                       PreparaObst(x);
        switch(nivel)
        {
          case 1:
           switch(t){
               case 0:
                 super.setBackground("ecsenario1.png");
               break;
               case 1:
                 super.setBackground("ecsenario2.png");
               break;
               case 2:
                 super.setBackground("ecsenario3.png");
               break;}
          break;
          case 2:
           switch(t){
               case 0:
                 super.setBackground("nivel2.png");
               break;
               case 1:
                 super.setBackground("nivel2a.png");
               break;
               case 2:
                 super.setBackground("nivel2b.png");
               break;}
          break;
          case 3:
           switch(t){
               case 0:
                 super.setBackground("nivel3.png");
               break;
               case 1:
                 super.setBackground("nivel3a.png");
               break;
               case 2:
                 super.setBackground("nivel3b.png");
               break;}
          break;}
        }
    
    /**
     * coloca un obstaculo en una posicion y determina 
     * que tipo de obstaculo poner o no poner ninguno
     * @param x coordenada x donde poner el obstaculo
     */
    public void PreparaObst(int x) 
    {
       int y2=350,y=400;
       int n=Greenfoot.getRandomNumber(10);
       if(x==50||x==560)
         n=1;
       if(n<5)
         super.addObject(new Obstaculo(nivel),x,y);
       if(n>5)
         super.addObject(new Obstaculo2(nivel),x,y2); 
       //if(n==5)
        // x=x-40;
    }
    /**
     * determina cuando saldra cada maloso 
     */
    public void PreparaMalosos()
    {
        int n=Greenfoot.getRandomNumber(600/nivel);
        if(n==97)
         super.addObject(new buitre(),this.getWidth(),100);
        if(n==10||n==100)
         super.addObject(new Pinguino1(),this.getWidth(),333);
        if(n==20||n==30)
          if(nivel==2)
            super.addObject(new Pinguino2(),this.getWidth(),333);
        if(n==200)
          if(nivel==3)
            super.addObject(new Oso(),this.getWidth(),333);
    }
    /**
     * determina si el jugador perdio
     */
    public void esFin()
    {
       if(vidas==0)
       {
           Greenfoot.playSound("gameover.mp3");
           addObject(new fin(),this.getWidth()/2,this.getHeight()/2);
           Greenfoot.delay(300);
           super.removeObjects(getObjects(null));
           preparaMenu();
           prepare();
           est=0;
           vidas=3;
           
       }
    }
    /**
     * actualiza el valor del objeto Vidas
     */
    public void actualizaVida()
    {
       if(vidas>0)
          vidas=vidas-1;
          
        vida.cambiaVidas(vidas);   
    }
    /**
     * cambia el estado del menu segun el boton 
     * precionado
     */
    public void cambiaEstado(int estado)
    {
        int x=50;
        super.removeObjects(super.getObjects(Boton.class));   
        switch(estado)
        {
            case 0:
                  preparaMenu();
                  prepare();
            break;
            case 1: 
                    est=estado;
                    for(x=50;x<650;x+=102)
                       PreparaObst(x);
                    vidas=3;
                    nivel=1;
                    municiones=20;
                    metros=3000;
                    bal= new Cont(municiones);
                    addObject(bal,10,10);
                    distancia= new Cont(metros);
                    addObject(distancia,593,10);
                    vida= new Vidas();
                    vida.cambiaVidas(vidas);
                    addObject(vida,460,15);
                    super.setBackground("ecsenario3.png");
                    jugador g=new jugador();
                    addObject(g,60,250);
                    break;
              case 2:
                     super.setBackground("creditos.PNG");
                     addObject(new Menu(),500,350);
              break;
              case 3:
              super.setBackground("help.png");
                     addObject(new Menu(),460,350);
                     break;
        }
    }

    /**
     *prepara el menu principal
     */
    private void prepare()
    {
        Play play = new Play();
        addObject(play, 100, 310);
        Credits credits = new Credits();
        addObject(credits, 203, 364);
        Help help = new Help();
        addObject(help, 380, 422);
        credits.setLocation(94, 175);
        play.setLocation(337, 359);
        help.setLocation(561, 185);
        play.setLocation(333, 335);
        help.setLocation(537, 185);
    }
}
